
package com.eva.android.widget;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import com.x52im.rbchat.R;

/**
 * 仿微信的按字母排序快速索引组件。
 *
 * @author github, JackJiang
 * @since 8.0
 */
public class LetterIndexBar extends View {

    private final static String TAG = LetterIndexBar.class.getSimpleName();

    /** 索引字母常量定义 */
    private final static String[] LETTERS = new String[]{
            "↑", /*"☆",*/ "A", "B", "C", "D", "E", "F", "G", "H",
            "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R",
            "S", "T", "U", "V", "W", "X", "Y", "Z", "#"
    };

    /** 字母显示字体大小 */
    private float mTextSize;
    /** 画笔 */
    private Paint mPaint;
    /** 字母单元宽度 */
    private int mCellWidth;
    /** 字母单元高度 */
    private float mCellHeight;
    /** 用于记录当前触摸的索引值 */
    private int mTouchIndex = -1;

    /** 字母选中事件监听者 */
    private OnLetterIndexSlectionListener mListener;

    public LetterIndexBar(Context context) {
        this(context, null);
    }

    public LetterIndexBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LetterIndexBar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        // 索引字母显示字体
        mTextSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getResources().getDisplayMetrics());

        // 画笔设置
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(c(R.color.quick_index_side_bar));
        mPaint.setTextSize(mTextSize);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);

        // 计算字母单元的宽度和高度
        mCellWidth = getMeasuredWidth();
        mCellHeight = getMeasuredHeight() * 1.0f / LETTERS.length;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // 设置透明背景
        setBackgroundColor(Color.TRANSPARENT);

        for (int i = 0; i < LETTERS.length; i++) {
            String text = LETTERS[i];

            // 计算文本的x坐标：
            // x坐标为单元格宽度的一半 减去 文字宽度的一半
            int x = (int) (mCellWidth / 2.0f - mPaint.measureText(text) / 2.0f);

            // 计算文本的高度
            Rect bounds = new Rect();
            mPaint.getTextBounds(text, 0, text.length(), bounds);
            int textHeight = bounds.height();

            // 计算文本的y坐标：
            // y坐标为单元格高度的一半 + 文字高度的一半 + 上面有多少个单元格的高度(index * mCellHeight)
            int y = (int) (mCellHeight / 2.0f + textHeight / 2.0f + i * mCellHeight);

            // 绘制选中字母的背景（选中绘为红色，否则置默认透明效果）
            mPaint.setColor(mTouchIndex == i ? c(R.color.colorAccent_light) : Color.TRANSPARENT);
            // 背景填充区域为圆形（x、y是中心点作标，中心点位置字母单元格的净宽和高的二分之一，半径为计算出的字母高度的倍数除以2得出）
            canvas.drawCircle(mCellWidth / 2.0f, (i * 1.0f + 0.5f) * mCellHeight, (textHeight*1.6f) / 2.0f, mPaint);

            // 绘制选中字母（选中绘为白色，否则置默认颜色）
            mPaint.setColor(mTouchIndex == i ? c(R.color.white) : c(R.color.quick_index_side_bar));
            // 绘制字母，x、y坐标为字母左上方的坐标
            canvas.drawText(text, x, y, mPaint);
        }
    }

    /**
     * View组件的触摸事件。
     *
     * @param event 事件来源
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int index = -1;
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                // y值 除以 每个单元格的高度 = 当前单元格的索引
                index = (int) (event.getY() / mCellHeight);
                if (index >= 0 && index < LETTERS.length) {
                    if (index != mTouchIndex) {
                        if (mListener != null) {
                            mListener.onLetterIndexSelected(LETTERS[index]);
                            mTouchIndex = index;

                            // 刷新ui，进行重绘（以便ui上更新有关当前选中索引的显示），没有此行则选中效果无法实现
                            invalidate();
                        }
                    }
                }
                // 设置按下时的景色
//              setBackgroundColor(c(R.color.quick_index_side_bar_pressed));
                break;
            case MotionEvent.ACTION_UP:
                mTouchIndex = -1;
                if (mListener != null) {
                    mListener.onLetterIndexUnselected();
                }

                // 刷新ui，进行重绘（以便ui上更新有关当前选中索引的显示），没有此行则选中效果无法清除
                invalidate();
                // 取消按下时的背景色
//              setBackgroundColor(Color.TRANSPARENT);
                break;
            default:
                break;
        }
//        invalidate();//重新调用onDraw方法实现选中的字母更改颜色
        return true;
    }

    private int c(int resColorId){
        return getResources().getColor(resColorId);
    }

    public void setOnLetterIndexSelectionListener(OnLetterIndexSlectionListener listener) {
        mListener = listener;
    }

    /**
     * 强制重置当前索引，目的是清除选中状态。
     */
    public void resetTouchIndex(){
        this.mTouchIndex = -1;
        this.invalidate();
    }

    /**
     * 字母索引选中事件监听者接口。
     */
    public interface OnLetterIndexSlectionListener {
        /** 快速索引字母被选中时 */
        void onLetterIndexSelected(String letter);
        /** 快速索引字母被取消选中时 */
        void onLetterIndexUnselected();
    }
}
